﻿#include <iostream>
#include <string>
using namespace std;
/* 类对象结构型模式
1.意图
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
2.别名
包装器Wrapper
3.适用性
a.你想使用一个已经存在的类，而它的接口不符合你的需求
b.你想创建一个可以复用的类，该类可以与其他不相关的类或不可预见的类（即那些接口可能不一定兼容的类）协同工作
c.（仅适用于对象Adapter）你想使用一些已存在的子类，但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器
可以适配它的父类接口
*/
class ThreeOutlet
{
public:
	void ThreeOutletCharge()
	{
		cout << "三插头充电开始" << endl;
	}
};
class AbstractTwoOutlet
{
public:
	virtual void TwoOutletCharge() = 0;
};
class TwoOutlet:public AbstractTwoOutlet
{
public:
	void TwoOutletCharge()
	{
		cout << "两插头充电开始" << endl;
	}
};
/*
//对象适配器模式
class TwoOutletAdapter :public AbstractTwoOutlet
{
public:
	TwoOutletAdapter(ThreeOutlet* pThree) :pThree(pThree) {}
	void Exchage()
	{
		cout << "两插头转换为三插头" << endl;
	}
	void TwoOutletCharge()
	{
		Exchage();
		pThree->ThreeOutletCharge();
	}
protected:
	ThreeOutlet* pThree;
};
*/
//类适配器模式
class TwoOutletAdapter :public AbstractTwoOutlet, public ThreeOutlet
{
public:
	void Exchange()
	{
		cout << "两插头转换为三插头" << endl;
	}
	void TwoOutletCharge()
	{
		Exchange();
		ThreeOutletCharge();
	}
};
/*
int main()
{
	/*
	//对象适配器测试
	ThreeOutlet* pThree = new ThreeOutlet;
	pThree->ThreeOutletCharge();
	AbstractTwoOutlet* pTwo = new TwoOutlet;
	pTwo->TwoOutletCharge();
	pTwo = new TwoOutletAdapter(pThree);
	pTwo->TwoOutletCharge();
	
	//类适配器测试
	ThreeOutlet* pThree = new ThreeOutlet;
	pThree->ThreeOutletCharge();
	AbstractTwoOutlet* pTwo = new TwoOutlet;
	pTwo->TwoOutletCharge();
	pTwo = new TwoOutletAdapter();
	pTwo->TwoOutletCharge();
	return 0;
}
*/